﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Noris.Schedule.Support.Services
{
	#region INTERFACE IFunctionMenuItem : předpis pro položku menu, které se nabízí na elementu grafu
	/// <summary>
	/// Interface, který předepisuje vlastnosti programu, který vytváří položku menu, které se nabízí na elementu grafu.
	/// </summary>
	public interface IFunctionMenuItem
	{
		/// <summary>
		/// Systém se ptá poskytovatele, zda chce pro daný element nabídnout svoji funkci.
		/// Poskytovatel se rozhodne podle typu grafu, typu elementu a třídy řádku a elementu.
		/// V tuto chvíli není znám konkrétní element. rozhodnutí platí pro všechny obdobné elementy grafu.
		/// Pro danou kombinaci se systém ptá jen jednou, odpověď platí pro všechny stejné řádky a elementy.
		/// Pro konkrétní řádek a element lze pouze řídit Enabled/Disabled položky menu, a to metodou GetMenuActivity().
		/// </summary>
		/// <param name="args">Specifikace situace, která nastala, a pro kterou systém hledá nabídku funkcí. 
		/// Do tohoto argumentu by měla tato metoda vepsat popisek menu, pokud jej chce nabízet.</param>
		/// <returns></returns>
		bool GetMenuSuitableFor(FunctionMenuItemSuitableArgs args);
	}
	#endregion
	#region CLASS FunctionMenuItemKey : SPECIFIKACE MENU (typ grafu, typ prostoru, typ elementu, datová třída)
	/// <summary>
	/// Třída popisuje příležitost, pro kterou se hledají vhodná menu.
	/// Pokud konkrétní provider chce v dané situaci nabídnout svoje menu, pak nastaví jeho vlastnosti a vrátí true.
	/// </summary>
	public struct FunctionMenuItemKey
	{
		#region KONSTRUKCE
		/// <summary>
		/// Konstruktor
		/// </summary>
		/// <param name="graphMode">Typ grafu</param>
		/// <param name="menuKind">Prostor, kde se kliklo</param>
		/// <param name="elementDrawType">Druh elementu</param>
		/// <param name="rowClassNumber">Číslo třídy řádku</param>
		/// <param name="elementClassNumber">Číslo třídy elementu</param>
		public FunctionMenuItemKey(RowGraphMode graphMode, FunctionMenuItemAreaType menuKind, GraphElementDrawType elementDrawType, int rowClassNumber, int elementClassNumber)
		{
			this._GraphMode = graphMode;
			this._AreaType = menuKind;
			this._ElementDrawType = elementDrawType;
			this._RowClassNumber = rowClassNumber;
			this._ElementClassNumber = elementClassNumber;
		}
		#endregion
		#region PROPERTY
		/// <summary> { get; }
		/// Typ grafu v aktuálním řádku
		/// </summary>
		public RowGraphMode GraphMode { get { return this._GraphMode; } }
		/// <summary> { get; }
		/// Typ prostoru, kam uživatel kliknul
		/// </summary>
		public FunctionMenuItemAreaType AreaType { get { return this._AreaType; } }
		/// <summary> { get; }
		/// Číslo třídy řádku
		/// </summary>
		public int RowClassNumber { get { return this._RowClassNumber; } }
		/// <summary> { get; }
		/// Číslo třídy elementu
		/// </summary>
		public int ElementClassNumber { get { return this._ElementClassNumber; } }
		/// <summary> { get; }
		/// Tvar elementu.
		/// </summary>
		public GraphElementDrawType ElementDrawType { get { return this._ElementDrawType; } }
		#endregion
		#region PROMĚNNÉ
		private RowGraphMode _GraphMode;
		private FunctionMenuItemAreaType _AreaType;
		private GraphElementDrawType _ElementDrawType;
		private int _RowClassNumber;
		private int _ElementClassNumber;
		#endregion
		#region OVERRIDES
		#endregion
	}
	#endregion
	#region CLASS FunctionMenuItemSuitableArgs : ZÍSKÁNÍ INFORMACÍ O MENU: URČENÍ TEXTU MENU A ZATŘÍDĚNÍ DO SKUPINY
	/// <summary>
	/// FunctionMenuItemSuitableArgs : Třída, pomocí které se provider vyjadřuje ke konkrétní situaci, zda chce nabízet svoje menu.
	/// </summary>
	public class FunctionMenuItemSuitableArgs
	{
		#region KONSTRUKCE
		public FunctionMenuItemSuitableArgs(FunctionMenuItemKey menuKey)
		{
			this._MenuKey = menuKey;
		}
		#endregion
		#region PROPERTY
		/// <summary> { get; }
		/// Typ grafu v aktuálním řádku
		/// </summary>
		public RowGraphMode GraphMode { get { return this._MenuKey.GraphMode; } }
		/// <summary> { get; }
		/// Typ prostoru, kam uživatel kliknul
		/// </summary>
		public FunctionMenuItemAreaType AreaType { get { return this._MenuKey.AreaType; } }
		/// <summary> { get; }
		/// Číslo třídy řádku
		/// </summary>
		public int RowClassNumber { get { return this._MenuKey.RowClassNumber; } }
		/// <summary> { get; }
		/// Číslo třídy elementu
		/// </summary>
		public int ElementClassNumber { get { return this._MenuKey.ElementClassNumber; } }
		/// <summary> { get; }
		/// Tvar elementu.
		/// </summary>
		public GraphElementDrawType ElementDrawType { get { return this._MenuKey.ElementDrawType; } }
		/// <summary> { get; set; }
		/// Text menu
		/// </summary>
		public string MenuCaption { get; set; }
		/// <summary> { get; set; }
		/// Obrázek v menu
		/// </summary>
		public Image MenuImage { get; set; }
		/// <summary> { get; set; }
		/// Skupina menu. Pokud chceme mít svoje položky menu pohromadě, pak sem vložíme unikátní název skupiny. 
		/// Hodnotou MenuOrder zajistíme třídění položek v rámci skupiny.
		/// </summary>
		public string MenuGroup { get; set; }
		/// <summary> { get; set; }
		/// Pořadí položky menu v rámci její skupiny MenuGroup.
		/// </summary>
		public int MenuOrder { get; set; }
		#endregion
		#region PROMĚNNÉ
		private FunctionMenuItemKey _MenuKey;
		#endregion
	}
	#endregion
	#region ENUM FunctionMenuItemAreaType : místo v grafu, kam člověk kliknul
	/// <summary>
	/// Druh objektu, na který uživatel kliknul
	/// </summary>
	public enum FunctionMenuItemAreaType
	{
		/// <summary>
		/// Prázdný řádek v grafu mezi elementy
		/// </summary>
		EmptyRow,
		/// <summary>
		/// Textová část grafu, některý sloupec
		/// </summary>
		TextItem,
		/// <summary>
		/// Prvek grafu, element
		/// </summary>
		GraphElement
	}
	#endregion
}
